﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Diagnostics;

namespace MVVMDemo.ViewModel
{
    ///<summary>
    ///lớp cơ sở cho tất cả các lớp ViewModel trong ứng dụng.
    ///Cung cấp hỗ trợ cho thông báo thay đổi
    ///<summary>
    public abstract class ViewModelBase: INotifyPropertyChanged
    {
        ///<summary>
        ///Được đưa lên khi một property trên đối tượng có giá trị mới
        ///<summary>
        public event PropertyChangedEventHandler PropertyChanged;

        ///<summary>
        ///cảnh báo developer nếu obj không có một thuộc tính public với tên cụ thể/đặc biệt
        ///method này không tồn tại
        ///lớp Debug dùng để tìm và sửa lỗi chương trình. Nó chỉ hoạt động trong đóng gói Debug
        ///</summary>
        [Conditional("DEBUG")]
        [DebuggerStepThrough]

        public void VerifyPropertyName(string propertyName)
        {
            //xác định tên property phù hợp on obj này
            if (TypeDescriptor.GetProperties(this)[propertyName] == null)
            {
                Debug.Fail("Invalid property Name:" + propertyName);
            }
        }

        // property có giá trị mới
        protected virtual void OnPropertyChanged(string propertyName)
        {
            this.VerifyPropertyName(propertyName);
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    
    }
}
